home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / xc2103i.lzh / XC2103.XDF / ASK30 / SAMPLE.C < prev    next >
C/C++ Source or Header  |  1993-09-15  |  5KB  |  314 lines

  1. /*
  2. **    サンプルアクセサリ for ASK3
  3. **    Copyright (C) 1992  ACCESS CO.,LTD.
  4. */
  5. #include "aci.h"
  6. #include "askkey.h"
  7. typedef unsigned char    u_char;
  8.  
  9. short    acc1_main(), acc2_main();
  10. u_char    cbuf[80];
  11. MEAN    kbuf[80];
  12. MEAN    mbuf[20];
  13.  
  14. ACC_DEF    acc1 = {
  15.     KS_EDITING|KS_SELECT,        /* invoke_stt    */
  16.     NOT_ASCII|HELP_KEY,        /* invoke_key    */
  17.     acc1_main,            /* acc_func    */
  18.     {
  19.         cbuf,    kbuf,    mbuf
  20.     }
  21. };
  22.  
  23. ACC_DEF    acc2 = {
  24.     KS_EDIT0|KS_EDITING,        /* invoke_stt    */
  25.     ('Q' - '@'),            /* invoke_key    */
  26.     acc2_main,            /* acc_func    */
  27.     {
  28.         cbuf,    kbuf,    mbuf
  29.     }
  30. };
  31.  
  32. short    acc1_main(code)
  33. BIT16    code;
  34. {
  35.     static u_char    tmp[21];
  36.     u_char    *ltohex(), *strcat();
  37.     u_char    *p;
  38.     int    i, l;
  39.  
  40.     for (p = cbuf, i = 0; i < 20; i++) {
  41.         if (*p == '\0')
  42.             break;
  43.         tmp[i] = *p++;
  44.     }
  45.     tmp[l = i] = '\0';
  46.     cbuf[0] = '\0';
  47.     for (i = 0; i < l; i++) {
  48.         strcat(cbuf,ltohex((long)tmp[i]));
  49.         strcat(cbuf," ");
  50.     }
  51.     return(DF_OUTSTR|CACI_END);
  52. }
  53.  
  54. u_char    digit[15];
  55.  
  56. u_char    *ltoa(l)
  57. unsigned long    l;
  58. {
  59.     register int    i;
  60.  
  61.     digit[14] = '\0';
  62.     for (i = 13; i >= 0; i--) {
  63.         digit[i] = l % 10 + '0';
  64.         l /= 10;
  65.     }
  66.     for (i = 0; i < 13; i++) {
  67.         if (digit[i] != '0')
  68.             break;
  69.     }
  70.     return(&digit[i]);
  71. }
  72.  
  73. u_char    *ltohex(l)
  74. unsigned long    l;
  75. {
  76.     register int    i;
  77.     u_char    c;
  78.  
  79.     digit[14] = '\0';
  80.     for (i = 13; i > 5; i--) {
  81.         c = l & 0x0000000f;
  82.         if (c < 10)
  83.             c += '0';
  84.         else
  85.             c += 'A' - 10;
  86.         digit[i] = c;
  87.         l >>= 4;
  88.     }
  89.     for (i = 6; i < 13; i++) {
  90.         if (digit[i] != '0')
  91.             break;
  92.     }
  93.     return(&digit[i]);
  94. }
  95.  
  96. short    acc2_main(code)
  97. BIT16    code;
  98. {
  99.     static int    first = 1;
  100.     static u_char    display[20];
  101.     static unsigned long    val;
  102.     static int    mode;
  103.     static int    hexmode = 0;
  104.     BIT16    nc, mask_key();
  105.     u_char    *p, *strcpy();
  106.     int    l, strlen();
  107.  
  108.     if (first) {
  109.         first = 0;
  110.         mode = 0;
  111.         val = 0L;
  112.         goto disp;
  113.     }
  114.     nc = mask_key(code);
  115.     if (nc == '\r') {
  116.         strcpy(cbuf,hexmode ? ltohex(val) : ltoa(val));
  117.         mode = 1;
  118.         return(DF_OUTSTR|CACI_SUSPEND);
  119.     }
  120.     if (nc == (CTRL_ON|NOT_ASCII|XF1_KEY)) {
  121.         first = 1;
  122.         return(KEY_AGAIN|CACI_END);
  123.     } else if (nc == '\033') {
  124.         first = 1;
  125.         return(CACI_END);
  126.     }
  127.     if (nc & NOT_ASCII)
  128.         return(CACI_NORMAL);
  129.     nc &= 0xff;
  130.     if (nc >= 'a' && nc <= 'z')
  131.         nc -= 'a' - 'A';
  132.     if (nc == 'X') {
  133.         hexmode = 1 - hexmode;
  134.         mode = 1;
  135.     } else if (nc >= '0' && nc <= '9' || nc >= 'A' && nc <= 'F') {
  136.         if (nc >= 'A') {
  137.             if (!hexmode)
  138.                 return(CACI_NORMAL);
  139.             nc -= 'A' - '0' - 10;
  140.         }
  141.         if (mode != 0) {
  142.             val = 0L;
  143.             mode = 0;
  144.         }
  145.         nc -= '0';
  146.         if (hexmode) {
  147.             val = (val << 4) | nc;
  148.         } else {
  149.             val = (val * 10) + nc;
  150.         }
  151.     }
  152. disp:
  153.     strcpy(display,hexmode ? "Hex " : "Dec ");
  154.     strcat(display,"[");
  155.     p = hexmode ? ltohex(val) : ltoa(val);
  156.     l = 10 - strlen(p);
  157.     while (l-- > 0)
  158.         strcat(display," ");
  159.     strcat(display,p);
  160.     strcat(display,"]");
  161.     l = sstrtom(display,kbuf,0);
  162.     kbuf[l] = 0;
  163.     return(DF_KWINSTR|CACI_NORMAL);
  164. }
  165.  
  166. BIT16    mask_key(code)
  167. BIT16    code;
  168. {
  169.     code &= (0xff|CTRL_ON|SHIFT_ON|NOT_ASCII);
  170.     if (!(code & NOT_ASCII))
  171.         code &= ~CTRL_ON;
  172.     return(code);
  173. }
  174.  
  175. u_char    *strcat(s1, s2)
  176. u_char    *s1, *s2;
  177. {
  178.     u_char    *ret = s1;
  179.  
  180.     while (*s1)
  181.         s1++;
  182.     while (*s1++ = *s2++)
  183.         ;
  184.     return(ret);
  185. }
  186.  
  187. u_char    *strcpy(s1, s2)
  188. u_char    *s1, *s2;
  189. {
  190.     u_char    *ret = s1;
  191.  
  192.     while (*s1++ = *s2++)
  193.         ;
  194.     return(ret);
  195. }
  196.  
  197. int    strlen(s)
  198. u_char    *s;
  199. {
  200.     u_char    *p = s;
  201.  
  202.     while (*s)
  203.         s++;
  204.     return(s - p);
  205. }
  206.  
  207. short    brksts;
  208.  
  209. int    sstrtom(str, buf, mode)        /* FPコール62番 */
  210. u_char    *str;                /* 8(a6) */
  211. MEAN    *buf;                /* 12(a6) */
  212. int    mode;                /* 16(a6) */
  213. {
  214. #asm
  215.     move.w    #-1,-(sp)
  216.     .dc.w    $ff33
  217.     addq.l    #2,sp
  218.     move.w    d0,_brksts
  219.     clr.w    -(sp)
  220.     .dc.w    $ff33
  221.     addq.l    #2,sp
  222. *
  223.     move.l    16(a6),-(sp)
  224.     move.l    12(a6),-(sp)
  225.     move.l    8(a6),-(sp)
  226.     move.l    #62,-(sp)
  227.     .dc.w    $ff22
  228.     lea.l    16(sp),sp
  229. *
  230.     move.l    d0,-(sp)
  231.     move.w    _brksts,-(sp)
  232.     .dc.w    $ff33
  233.     addq.l    #2,sp
  234.     move.l    (sp)+,d0
  235. #endasm
  236. }
  237.  
  238. /*[ここまで]CONの一部(スーパーバイザモードで動作する)
  239. **[ここから]ユーザモード
  240. */
  241.  
  242. int    askver()            /* FPコール50番 */
  243. {
  244. #asm
  245.     move.l    #50,-(sp)
  246.     .dc.w    $ff22
  247.     addq.l    #4,sp
  248. #endasm
  249. }
  250.  
  251. int    acc_touroku(accdef)        /* FPコール60番 */
  252. ACC_DEF    *accdef;            /* 8(a6) */
  253. {
  254. #asm
  255.     move.l    8(a6),-(sp)
  256.     move.l    #60,-(sp)
  257.     .dc.w    $ff22
  258.     addq.l    #8,sp
  259. #endasm
  260. }
  261.  
  262. int    acc_delete(acc_handle)        /* FPコール61番 */
  263. int    acc_handle;
  264. {
  265. #asm
  266.     move.l    8(a6),-(sp)
  267.     move.l    #61,-(sp)
  268.     .dc.w    $ff22
  269.     addq.l    #8,sp
  270. #endasm
  271. }
  272.  
  273. #include <stdio.h>
  274. #include <signal.h>
  275.  
  276. int    ah1, ah2;            /* アクセサリ・ハンドル */
  277.  
  278. void die()
  279. {
  280.     /* アクセサリを削除する */
  281.     if (acc_delete(ah1) == 0)
  282.         printf("アクセサリ1を削除しました.\n");
  283.     if (acc_delete(ah2) == 0)
  284.         printf("アクセサリ2を削除しました.\n");
  285.     exit(1);
  286. }
  287.  
  288. void    main()
  289. {
  290.     /* ASKのバージョンチェック */
  291.     if (askver() < 300) {
  292.         printf("ASKのバージョンが3以上ではありません.\n");
  293.         exit(1);
  294.     }
  295.  
  296.     signal(SIGINT, die);
  297.  
  298.     /* アクセサリを登録する */
  299.     if ((ah1 = acc_touroku(&acc1)) == -1)
  300.         printf("アクセサリ1を登録できません.\n");
  301.     else
  302.         printf("アクセサリ1を登録しました.\n");
  303.     if ((ah2 = acc_touroku(&acc2)) == -1)
  304.         printf("アクセサリ2を登録できません.\n");
  305.     else
  306.         printf("アクセサリ2を登録しました.\n");
  307.  
  308.     /* アクセサリを試す */
  309.     while (getchar() != EOF)
  310.         ;
  311.  
  312.     die();
  313. }
  314.